/*
 * Copyright 2011 Rivoli team
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package groovy.runtime.metaclass.java.lang


import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition
import org.springframework.beans.factory.config.BeanDefinition
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider
import org.springframework.core.type.classreading.MetadataReader
import org.springframework.util.ClassUtils

class ClassMetaClass extends DelegatingMetaClass {
	ClassMetaClass(MetaClass metaClass) {
		super(metaClass)
	}

	Object invokeStaticMethod(Object clazz, String methodName, Object[] arguments) {
		if ((methodName == 'from') && (arguments.length == 1)) {
			from(arguments[0])
		} else {
			super.invokeMethod(clazz, methodName, arguments)
		}
	}

	private Set<Class<?>> from(String packageName) {
		new LenientClassPathScanningCandidateComponentProvider().findCandidateComponents(packageName).collect {BeanDefinition definition ->
			ClassUtils.forName(definition.beanClassName, ClassUtils.defaultClassLoader)
		} as Set
	}

	private static class LenientClassPathScanningCandidateComponentProvider extends ClassPathScanningCandidateComponentProvider {
		LenientClassPathScanningCandidateComponentProvider() {
			super(false)
		}

		@Override
		protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
			true
		}

		@Override
		protected boolean isCandidateComponent(MetadataReader metadataReader) {
			true
		}
	}
}